#include<bits/stdc++.h> 
using namespace std;
//	如果机器只能存3位有效数字，则float数字12300和12358.9是一样的，因为他们都被存成0.123*
//	10^5。现在给定一个有效位数，然后给机器两个数字，需要判断是否相同
//1.每个输入有一个测试用例，每个测试用例包括三个数字N，A和B，其中N<100，是有效位数，A和B
//	是两个float类型的数字，都是非负且不大于10^100，并且总位数小于100位
//2.对于每个测试用例，如果两个数字相同就输出YES，并且下一行输出0.xxx*10^k。如果不同就输出
//	NO，并且输出两个数字的0.xxx*10^k
//3.字符串遍历，科学计数法
//这道题本身很好理解，但是测试数据就很烦，例如他可能会有0000001这样的数字，也有0000.001这样
//的数字，所以需要准确找到有效位数其实并不简单。
//解法不多介绍，讲个测试点4：1 00.01 0.010 结果为YES 0.1*10^-1 
int N=3;
string change(string s){
	unsigned int len = s.length();
	int count_=0;
	bool f = false;
	int kk = 0;
	string ans="";
	for(unsigned int i = 0;i<len;i++){
		if(s[i]=='.') continue;
		if(s[i]=='0'&&f==false) continue;
		else if(f==false){
			kk = i;
			f = true;
		}
		if(count_<N){
			ans+=s[i];
			count_++;	
		}
		else break;
	}
	if(ans.length()<N){
		for(int i = ans.length();i<N;i++){
			ans += "0";
		}
	}
	int k = 0;
	if(f==false){
		k = 0;
	}
	else if(kk == 0){
		kk = s.find('.')==-1? s.length():s.find('.');
		k = kk;
	}
	else{
		if(s.find('.')==-1){
			string tmp = s.substr(s.find(ans[0]));
			k = tmp.length();
		}
		else{
			string tmp = "0" + s.substr(s.find('.'));
			k = 2 - tmp.find(ans[0]);
		}
		
	}
	stringstream ss;
	ss<<k;
	ans = "0."+ans+"*10^"+ss.str();
	return ans;
} 
int main(){
	string A,B;
	cin>>N>>A>>B;
	A = change(A);
	B = change(B);
	if(A==B){
		cout<<"YES"<<" "<<A<<endl;
	}
	else{
		cout<<"NO "<<A<<" "<<B<<endl;
	}
	return 0;
}